package com.hopu.haogoumall.db.service;

import com.hopu.haogoumall.db.dto.CategoryGoodsDto;
import com.hopu.haogoumall.db.dto.GrouponRulesDto;
import com.hopu.haogoumall.db.module.*;
import org.springframework.cache.annotation.Cacheable;

import java.util.List;

/**
 * @Package: com.hopu.haogoumall.db.service
 * @ClassName: VxHomeService
 * @Author: xiaoBao
 * @CreateTime: 2020-12-11 15:45
 * @Description:【商城首页相关功能业务层接口】
 */
public interface VxHomeService {
    /** @Cacheable注解：注解在方法上，对方法的返回值进行缓存，下次再调用该方法时如果传入的参数相同，则直接从缓存中取，常用属性如下：
     *      cacheNames：指定缓存空间的名字（缓存空间相当于一个容器，一个缓存空间可以存放多个缓存对象，每个缓存对象都有一个唯一的Key标识。）；
     *      key：指定每一个缓存对象的唯一标识，默认是使用方法参数的值，如果设为常量，则需要包裹；
     *      key属性的值支持SpEL表达式：如"#root.methodName"；
     *              #root.methodName  将方法名作为key
     *              #root.method.name  将整个方法作为key
     *              #root.target  将被调用的目标对象作为key
     *              #root.targetClass  将被调用的目标类作为key
     *              #root.args[0/1/2/3]   将参数列表的值作为key
     *              #参数名   将参数列表中参数名对应的值作为key
     *              #a0/1/2/3/4  将第0、1、2、3、4个参数的值作为key
     *              #result：方法执行后的返回值
     *      condition：指定缓存/清除缓存的条件，可以使用SpEL表达式，当条件为true时则缓存/清除缓存；
     *      unless：指定不缓存/不清除缓存的条件，和condition相反，条件为false时才缓存/清除缓存
     *      keyGenetator：指定key生成策略
     *
     *  @CachePut：注解在方法上，在每次进入到方法时，即调用了方法，又更新了缓存；（常用在更新语句的方法上）；
     *  @CacheEvict：清空缓存（常用在删除的方法上）；
     *      【属性】：
     *          key：指定要清除的数据
     *          allEntries = true：指要清楚所有数据
     *          beforeInvocation = false：false为在方法执行之后清除，true为在方法执行之前清除，默认为false
    */

    /** 查询商品总数量*/
    @Cacheable(cacheNames = "homeIndexFindContainer" ,key = "#root.methodName")
    int findGoodsCount();

    /** 查询所有广告信息*/
    @Cacheable(cacheNames = "homeIndexFindContainer" ,key = "#root.methodName")
    List<HaogoumallAd> findBannerInfo();

    /** 查询所有商品分类*/
    @Cacheable(cacheNames = "homeIndexFindContainer" ,key = "#root.methodName")
    List<HaogoumallCategory> findCategoryInfo(Integer pid);

    /** 查询所有优惠券信息  两个参数：1、优惠券的当前页   2、每页显示的数量*/
    @Cacheable(cacheNames = "homeIndexFindContainer" ,key = "#root.methodName")
    List<HaogoumallCoupon> findCouponInfo(Integer couponPage, Integer couponLimit);

    /** 查询所有团购信息  两个参数：1、团购信息的当前页   2、每页显示的数量*/
    @Cacheable(cacheNames = "homeIndexFindContainer" ,key = "#root.methodName")
    List<GrouponRulesDto> findGrouponInfo(Integer grouponPage, Integer grouponLimit);

    /** 查询所有品牌直供商相关信息  两个参数：1、品牌直供商信息的当前页   2、每页显示的数量*/
    @Cacheable(cacheNames = "homeIndexFindContainer" ,key = "#root.methodName")
    List<HaogoumallBrand> findBrandInfo(Integer brandPage, Integer brandLimit);

    /** 查询所有新品发售商品信息  两个参数：1、新品发售商品的当前页   2、每页显示的数量*/
    @Cacheable(cacheNames = "homeIndexFindContainer" ,key = "#root.methodName")
    List<HaogoumallGoods> findNewGoodsInfo(Integer newGoodPage, Integer newGoodLimit);

    /** 查询所有人气商品  两个参数：1、人气商品的当前页   2、每页显示的数量*/
    @Cacheable(cacheNames = "homeIndexFindContainer" ,key = "#root.methodName")
    List<HaogoumallGoods> findHotGoodsInfo(Integer hotGoodPage, Integer hotGoodLimit);

    /** 查询所有专题精选商品  两个参数：1、专题精选商品的当前页   2、每页显示的数量*/
    @Cacheable(cacheNames = "homeIndexFindContainer" ,key = "#root.methodName")
    List<HaogoumallTopic> findTopicInfo(Integer topicPage, Integer topicLimit);

    /** 查询每个分类的部分商品显示在首页  两个参数：1、每个分类的当前页  2、每页显示的数量  3、父级分类名称的Pid*/
    @Cacheable(cacheNames = "homeIndexFindContainer" ,key = "#root.methodName")
    List<CategoryGoodsDto> findFloorGoodInfo(Integer floorGoodPage, Integer floorGoodLimit, Integer pid);
}
